一、為什麼功能越多,程式碼越難維護?
在前面的文章中,我們已經完成病患資料的新增、查詢、修改、刪除、搜尋與詳細資料頁面。
不過,當功能逐漸增加時,可能會發現一個問題:Servlet 裡面除了接收使用者輸入,還要處理 SQL、連接資料庫、整理資料,甚至決定要轉去哪個 JSP 頁面。
如果所有工作都放在同一個類別中,程式碼很容易越來越長。
因此,今天要認識 DAO(Data Access Object,資料存取物件),將資料庫操作獨立出來,讓不同類別各自負責自己的工作。
二、先理解三個角色
例如,使用者想查看病患清單時,流程可以是:
使用者 → PatientListServlet → PatientDAO → MySQL → JSP
這樣未來即使要修改 SQL,也不必到每個 Servlet 裡逐一尋找。
三、建立 PatientDAO
假設專案中已經有 Patient 類別,以及可用的 DBConnection.getConnection() 方法。以下範例將查詢病患資料的工作放進 DAO。
package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import model.Patient;
import util.DBConnection;
public class PatientDAO {
public List findAll() throws Exception {
List patients = new ArrayList<>();
String sql = "SELECT id, name, gender, birth_date, phone "
+ "FROM patient ORDER BY id DESC";
try (Connection conn = DBConnection.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
Patient p = new Patient();
p.setId(rs.getInt("id"));
p.setName(rs.getString("name"));
p.setGender(rs.getString("gender"));
p.setBirthDate(rs.getDate("birth_date"));
p.setPhone(rs.getString("phone"));
patients.add(p);
}
}
return patients;
}
}
注意:這段程式假設 Patient 類別具有對應的欄位與 setter。如果你的專案使用不同的欄位名稱或日期型別,記得調整。
try-with-resources 可以在程式離開區塊時自動關閉 JDBC 資源,減少連線未關閉的問題。
四、讓 Servlet 只負責流程
原本的 Servlet 可能包含整段 SQL 查詢。整理後,就可以簡化成:
@WebServlet("/patient/list")
public class PatientListServlet extends HttpServlet {
@Override
protected void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
try {
PatientDAO dao = new PatientDAO();
request.setAttribute(
"patients", dao.findAll()
);
request.getRequestDispatcher(
"/patient-list.jsp"
).forward(request, response);
} catch (Exception e) {
throw new ServletException(
"無法取得病患清單", e
);
}
}
}
這樣 Servlet 便不需要直接處理 SQL,閱讀起來也更清楚。
五、其他功能也能使用 DAO
除了 findAll(),後續還可以逐步加入:
不需要一次重寫所有程式,可以先從查詢清單開始,再逐步將其他功能搬過去。
六、今日小結
今天學會了 DAO 的基本概念,也將資料庫操作與請求處理分開。
這不只是讓程式碼變短,更重要的是建立清楚的分工。當醫療資訊系統增加更多功能時,良好的結構能讓除錯、測試與維護變得容易。
下一篇,我們將開始實作登入功能,讓系統不再只是任何人都能直接開啟的資料管理頁面。
本篇使用模擬病患資料進行開發,請勿直接放入真實病患個資。